/**
 * @file rscNet.h
 * @brief Racchiude le funzionalità per fornire le comunicazioni di rete.
 *
 * Vengono inserite le strutture per configurare e gestire le risorse di rete.
 *
 * @date Mar 27, 2012
 * @author Francesco Corvino
 */

#ifndef RSCNET_H_
#define RSCNET_H_

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include "../RscHost/session.h"

#define UDP_MAX_SIZE_PKT 65000

#define KEY_NETINFO_STRING "net-info"

#define KEY_NETINFO_INT CMap_StringHash(KEY_NETINFO_STRING)


typedef struct addrinfo AddressInfo;

typedef struct sockaddr Address;

typedef struct NetOperation_ {
	int bytesReceived;
	int bytesSent;
	int typeProtocol;
	int nsequence;
} NetOperation;

typedef struct NetSession_ {
	DynArray operations;
} NetSession;

//////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per la gestione degli elementi in memoria ////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////

void RscNet_init(HostSession * session);

void RscNet_addOperation(HostSession * session, NetOperation * op);

//////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per la gestione delle comunicazioni base UDP /////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////

int UDP_getFdSocketFor(char *addr, char *port, AddressInfo * res);

int UDP_sendMsgTo(int sockfd, AddressInfo * p, char *msg);

void UDP_recvMsg(int sockfd, char *bufin, int maxBufin, Address * remote);

#endif /* RSCNET_H_ */
